今天是第12天了,在這個鐵人賽裡已經完成3分之1了,每天要PO文的狀態,讓我最近回家都很準時睡覺,可能順便改善了作息呢,一舉數得。
今天要來介紹 while 這個控制流的語法。
while 是一個路一值運行到條件變成 false,才會停下的語法。有兩種可使用的 while 方法。
while循環通過評估單個條件開始。如果條件為true,則重複執行一組語句,直到條件變為false。
以下是while循環的一般形式:
while condition {
statements
}
此示例播放了蛇和梯子(也稱為滑道和梯子)的簡單遊戲:
要做的功能 遊戲規則:
let finalSquare = 25
var board = [Int](repeating: 0, count: finalSquare + 1)
board[03]= +08; board[06]= +11; board[09]= +09; board[10]= +02
board[14]= -10; board[19]= -11; board[22]= -02; board[24]= -08
var square=0
var diceRoll=0
while square < finalSquare {
// roll the dice
diceRoll += 1
if diceRoll == 7 { diceRoll=1 }
// move by the rolled amount
square += diceRoll
if square < board.count {
// if we're still on the board, move up or down for a snake or a ladder
square += board[square]
}
}
print("Game over!")
前兩行在做第一個的設定,而為什麼 borad 裡面 count 要 +1 呢?因為從 0 開始所以才要加 1 進去。
let finalSquare = 25
var board = [Int](repeating: 0, count: finalSquare + 1)
然後,第5 6行在做圖面上採到的數值增減。而這邊有用上一元加跟減的運算符,來顯示數值增減,並且把小於10的數值補上 0 來讓程式碼看起來更整潔。
board[03]= +08; board[06]= +11; board[09]= +09; board[10]= +02
board[14]= -10; board[19]= -11; board[22]= -02; board[24]= -08
然後接下來就是他的機制了,square 就是位置的值,diceRoll 去操控他移動的數值,diceRoll的移動數值是固定順序 1, 2, 3, 4, 5, 6, 1, 2 依此類推。
而 square 小於 board.count 就是還在圖板上,所以還在圖板上的話我們就去看有沒有對應到剛剛 5 6行在做的特定數值,再進行增加。
最後如果大於 finalSquare 就遊戲結束。
var square=0
var diceRoll=0
while square < finalSquare {
// 擲骰子
diceRoll += 1
if diceRoll == 7 { diceRoll=1 }
// 根據點數移動
square += diceRoll
if square < board.count {
// 如果還在棋盤上就看有沒有要順著爬上去或下來。
square += board[square]
}
}
print("Game over!")
repeat-while 跟前面的區別是先執行一次循環之後再判別狀態是不是 false
repeat-while的格式
repeat {
statements
} while condition
接續上面的遊戲,如果使用 repeat-while的話方式會變成下面這樣
let finalSquare = 25
var board = [Int](repeating: 0, count: finalSquare + 1)
board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08
var square = 0
var diceRoll = 0
//原本的設定
repeat {
// 顺着梯子爬上去或者顺着蛇滑下去
square += board[square]
// 掷骰子
diceRoll += 1
if diceRoll == 7 { diceRoll = 1 }
// 根据点数移动
square += diceRoll
} while square < finalSquare
print("Game over!")
檢測完玩家是否踩在梯子或者蛇上之後,開始擲骰子,然後玩家向前移動 diceRoll 個方格,本輪循環結束。
然後就會繼續循環直到 square 大於 finalSquare
這兩個的方法版本 repeat-while 的版本比較好,因為它可以先檢查 square 有沒有超過 board 這樣就可以省略越界的檢查(下面這個)。
if square < board.count {
square += board[square]
}
好的,今天就先介紹到這邊,讓我們休息明天繼續。